home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
post2_g2
/
src
/
p_fuku.c
< prev
next >
Wrap
Text File
|
1997-10-13
|
5KB
|
207 lines
/*
post / 郵便番号検索プログラム
p_fuku.c / 複数候補検査部
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <unistd.h>
#include "post.h"
/*
複数可能性チェック
*/
void
check_kanousei( int shiku_num[5] )
{
int i1=0, i2=0, /* ループ汎用 */
ichi[ 16 ], /* デリミタ発見位置 */
last_pos = 0, /* 最終位置を持つ */
s_num = 0, /* 候補選択用 */
ctr = 0, /* スケジュール・カウンタ */
find_ku = 0, /* 市内区発見スイッチ */
len_str = 0; /* 文字列長さ */
int delim1[ 32 ], /* デリミタ格納用 */
delim2[ 32 ];
uchar strwk1[ 32 ][ 33 ], /* 文字列の候補 */
strwk2[ 32 ][ 33 ];
uchar sbuf[8]; /* 候補選択用 */
uchar numbuff[12];
/* 初期化 */
sbuf[ 0 ] = '\0';
for( i1=0; i1<=15; i1++ ) {
ichi[ i1 ] = -1;
}
for( i1=0; i1<=31; i1++ ) {
strwk1[ i1 ][ 0 ] = '\0';
strwk2[ i1 ][ 0 ] = '\0';
delim1[ i1 ] = -1;
delim2[ i1 ] = -1;
}
/* 位置関係表を作る */
len_str = strlen( input_str );
last_pos = len_str / 2 - 1; /* 最終位置をセット */
for( i1=1; i1<=last_pos; i1++ ) {
/* 1からなのは、先頭は検査する必要がないから */
for( i2=0; i2<=4; i2++ ) { /* 各デリミタごと */
if( (input_str[ i1*2 ] == kanji_shiku[ i2 ][ 0 ]) &&
(input_str[ i1*2+1 ] == kanji_shiku[ i2 ][ 1 ]) ) {
ichi[ i1 ] = i2;
}
}
}
/* 位置関係表をもとに検証 */
for( i1=1; i1<=last_pos; i1++ ) {
if( ichi[ i1 ] == -1 ) { /* 何も入っていない */
continue;
} else if( ichi[ i1 ] == 2 ) { /* 郡 */
if( (i1 != last_pos) && (i1 != last_pos-1) ) { /* 最終位置でない */
str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
for( i2=i1+2; i2<=last_pos; i2++ ) { /* 後ろを検査 */
if( (ichi[ i2 ] == 3) || /* 町村があれば */
(ichi[ i2 ] == 4) ) {
str_bcpy( strwk2[ ctr ], (i1+1)*2, i2*2+1 );
if( sonzai_check( strwk1[ ctr ],strwk2[ ctr ],
2, ichi[ i2 ] )) {
delim1[ ctr ] = 2; /* 郡 */
delim2[ ctr ] = ichi[ i2 ];
ctr++; /* 進める=候補に取り込む */
break; /* i2のforを進める */
}
}
}
}
} else if( ichi[ i1 ] == 0 ) { /* 市 */
str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
if( (i1 == last_pos) || (i1 == last_pos-1) ) { /* 最終位置なら */
if( sonzai_check( strwk1[ctr], NULL, 0, -1 ) ) {
delim1[ ctr ] = 0; /* 市 */
strwk2[ ctr ][0] = '\0'; /* 念のため */
delim2[ ctr ] = -1;
ctr++;
}
} else { /* 最終位置でない */
/* 市内区を探す */
for( i2=i1+2; i2<=last_pos; i2++ ) {
if( ichi[i2] == 1 ) { /* 市内区がある? */
str_bcpy( strwk2[ ctr ], (i1+1)*2, i2*2+1 );
if( sonzai_check( strwk1[ctr], strwk2[ctr],
0, 5 )) {
delim1[ ctr ] = 0;
delim2[ ctr ] = 1;
ctr++;
find_ku = 1;
break; /* i2のforを進める */
}
}
}
if( find_ku == 0 ) {
if( sonzai_check( strwk1[ctr], NULL, 0, -1 ) ) {
delim1[ ctr ] = 0;
strwk2[ ctr ][0] = '\0'; /* 念のため */
delim2[ ctr ] = -1;
ctr++;
}
}
}
} else if( ichi[ i1 ] == 1 ) { /* 区 */
if( (todo_sw) && (num_pref != 12) ) { /* 東京都でなければ */
continue;
} else {
str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
if( sonzai_check( strwk1[ctr], NULL, 1, -1 ) ) {
delim1[ ctr ] = 1;
strwk2[ ctr ][0] = '\0'; /* 念のため */
delim2[ ctr ] = -1;
ctr++;
}
}
} else if( (ichi[ i1 ] == 3) || (ichi[ i1 ] == 4) ) { /* 町・村 */
str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
if( sonzai_check( strwk1[ctr], NULL, ichi[ i1 ], -1 ) ) {
delim1[ ctr ] = ichi[ i1 ];
strwk2[ ctr ][0] = '\0'; /* 念のため */
delim2[ ctr ] = -1;
ctr++;
}
}
} /* for終端 */
ctr--; /* 調整 */
if( ctr == -1 ) {
puts("警告 401 : 入力された住所からは、郵便番号が検索できませんでした。");
return;
} else if( ctr == 0 ) {
/* cut_checkする */
cut_check( delim1[ 0 ], delim2[ 0 ] );
} else {
/* えらんでもらう */
printf("解析の結果、次のような候補を検索することができました。\n");
printf("希望する正しい住所を選択して下さい。\n");
do {
for( i1=0; i1<=ctr; i1++ ) {
printf("%2d : %s|%s|%s\n", i1+1, strwk1[i1], strwk2[i1],
nokori( strwk1[i1], strwk2[i1] ) );
}
printf("1 から %2d までの数字で選択して下さい :",ctr+1);
scanf( "%2s", numbuff );
s_num = atoi( numbuff );
} while ( (s_num < 1) || (s_num > ctr+1) );
printf("\n");
s_num--;
/* cut_checkする */
cut_check( delim1[ s_num ], delim2[ s_num ] );
}
return;
}